iT邦幫忙

2021 iThome 鐵人賽

DAY 27
1

「我家今晚沒人,這是我的地址。」


我們昨天介紹了區塊鏈的基本架構,
知道交易紀錄如何在區塊鏈上保存、連接。

  • 從最外層開始看起,
    區塊鏈裡面有區塊,由礦工去更改Nonce值,
    最後將這些區塊用哈西值 (雜湊值)鏈起來,達到不可竄改性。

  • 區塊裡面包含幾個部分:
    使用的版本、難度、上一區塊的雜湊值、交易資料的Merkle Root、時間戳記、Nonce
    我們在兩天前有秀過區塊的內容。

今天我們要更著重於交易資訊內容裡非常重要的資訊:地址。
先放上一個交易內容。

這可不是普通的交易,這個是比特幣有史以來第一個交易。

https://ithelp.ithome.com.tw/upload/images/20211009/20140112uZFYcrAka1.png

可以看到此交易的雜湊值,以及金額50BTC,時間是2009/01/04
新產生的比特幣轉到某個人的帳戶(1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa)裡,
而這個人大概就是中本聰。
(之後還有很多人打幣給他,所以餘額並不是50BTC)

https://ithelp.ithome.com.tw/upload/images/20211009/20140112gjiPm2YIDo.png

不過那並不是重點,
今天的重點是,這個地址是怎麼回事。

私鑰公鑰地址

標題下的很爛,不過就是這麼回事。
區塊鏈的地址是由「私鑰→公鑰→地址」的流程變來的,

私鑰變公鑰,公鑰不能變私鑰這件事情我們已經知道了,
那地址能不能變公鑰呢?

答案是不行。
先賣個關子,等你看完應該就理解了,我們還是一步一步來,從頭開始。

私鑰

比特幣的私鑰為256位元,
可以從0x1到
0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4140
中任選一個數字,每一個數字在secp256k1這個橢圓曲線上都是可行的。

我們都會有一個疑問,隨機挑一個數字真的可行嗎?
如果我跟另外一個人挑到一樣的數字,那不就完了?
答案是,還真的完了。

雖然完了,但也不太可能發生。

256位元就意味著總共有 https://chart.googleapis.com/chart?cht=tx&chl=2%5E%7B256%7D個數字,或者說1.16 × https://chart.googleapis.com/chart?cht=tx&chl=10%5E%7B77%7D個數字
而全球人口四捨五入後不過就https://chart.googleapis.com/chart?cht=tx&chl=10%5E%7B10%7D(100億),要想抽到同一個數字實在不簡單。

所以實在沒有碰撞的可能性。

公鑰

公鑰由私鑰產生,而比特幣使用的是 secp256k1 這個橢圓曲線,
還記得我們在說明ECC(DAY 15)時有說到

K=k*G

其中K是公鑰,k是私鑰,G是基點,
G的壓縮型是

02 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798

藉由運算就可以得到相對應的私鑰。

壓縮型、非壓縮型(compressed/uncompressed form)

橢圓曲線是在直角坐標上點的運算,因此會有x座標和y座標。
而壓縮型就是在表示時不標示y座標,因為 y 是可以從 x 推算出來的。

雖然如此,橢圓區線上同一個 x 座標可以對應到兩個 y 座標,
於是我們需要在公鑰前加上前綴(prefix)。

  • 02 壓縮型(y座標>0)
  • 03 壓縮型(y座標<0)
  • 04 未壓縮型

所以你可以回去看到基點G的開頭是02,代表這是一個壓縮型的表示方式且y座標 > 0

而未壓縮型的G是

04 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798 483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8

兩個表示方式的長度差了一倍。

地址

地址是由公鑰導出來的,
首先會先過兩層雜湊函數,第一個是SHA-256,第二個是ripemd160(也是雜湊函數)。
我稱這個運算後的值為公鑰雜湊值好了

*我們等一下會組合成一個值,我稱它為「準地址」,這個值接著使用base58編碼後就會成為地址。

準地址由三個部分組成,0x00、公鑰雜湊值、校驗格。依序排列。
其中校驗格 = SHA(SHA(0x00公鑰雜湊值))的前四位元組(byte)

以上是 P2PKH (Pay to Public Key Hash) 格式的地址產生方式,他的開頭會是1。
另外一種P2SH (pay to script hash)格式是比較新的表示方法,開頭是3。

他的生成方式如下,我就不一一解釋了。

P2PKH和P2SH有不同的性質,在交易上會有差別,
不過那個不是我們今天的討論範圍,有興趣的人可以去讀 這篇


大概是鐵人30天目前花最多時間的一篇(還自己做圖天啊)
因為是沒有學過的東西,所以花蠻多時間統整資料的,
若有錯誤再請不吝指教。

那麼,明天見!

參考資料:
https://know.zombit.info/私鑰公鑰與地址/
https://www.0x1.academy/wallet/address
https://medium.com/coinmonks/how-to-generate-a-bitcoin-address-step-by-step-9d7fcbf1ad0b
https://en.bitcoin.it/wiki/Private_key


上一篇
DAY 26- 分叉 Fork
下一篇
DAY 28- BIP32- HD wallet
系列文
學密碼學也猜不到你的手機密碼30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言